/**
 * v8host.cpp       Implementation file for main ().
 * Version:         1.0
 *
 * Copyright (c) Bal Bahadur Chettri
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided 
 * that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this list of conditions and the 
 * following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials provided with the 
 * distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Last Updated: Dec 10 2011
 */
#include "v8class.h"
#include "point.h"
#include "global.h"

using namespace v8;

// externs...
extern "C" const char *V8HOST_EMBEDDED_JS_SCRIPT;

// function prototypes...
int v8host_main ();
Handle<ObjectTemplate> v8host_init_global ();

// main...
int main (int argc, char *argv[]) {
	return v8host_main ();
}

// funtion definitions... 

int v8host_main () {
	HandleScope handle_scope;

	Handle<ObjectTemplate> global = v8host_init_global ();
	if (*global == NULL) {
		return -1;
	}

	Persistent<Context> context = Context::New (NULL, global);
	
		Context::Scope context_scope (context);

		Handle<String> script_source = String::New (
											V8HOST_EMBEDDED_JS_SCRIPT
											);

		Handle<Script> script = Script::Compile (script_source);
		Handle<Value> value = script->Run ();		
	
	context.Dispose();

	V8ClassInstanceManager::RemoveAllInstances ();
	
	return 0;
}

Handle<ObjectTemplate> v8host_init_global () {
	HandleScope handle_scope;

	Handle<ObjectTemplate> global = Global::GetTemplate();

	// export all required classes in the Global template...
	Point::Export (global);

	return handle_scope.Close (global);
}
